// 1. 共同点是，type也可以描述对象的结构或函数的类型
// type User = {
//   name: string;
//   age: number;
// }

// const xm: User = { name: "小明", age: 10 }
// console.log(xm)

// type setUser = (name: string, age: number) => void
// 2. 扩展和实现上的区别
// type不能extends或者implement，但是type可以通过交叉类型实现interfaces的extends行为
// interface 可以extends type，同时type也可以与interface类型交叉

// interface Name {
//   name: string;
// }

// interface User extends Name {
//   age: number;
// }

// let stu: User = { name: "x", age: 10}

// 上面的扩展可以用type交叉类型实现
// type Name = {
//   name: string;
// }

// type User = Name & { age: number }
// let stu:User = { name: 'wang', age: 1}

// console.log(stu)

// interface 可以extends type
// type Name = { name: string }
// interface User extends Name {
//   age: number;
// }
// let stu:User = { name: 'wang', age: 1 }

// type与interface 交叉
// interface Name {
//   name: string;
// }

// type User = Name & {
//   age: number
// }

// let stu:User = { name: 'wang', age: 1 }

// 3. 接口可以多次定义合并，而type不可以定义多次

interface User {
  name: string;
  age: number;
}

interface User {
  sex: string
}

let user:User = { name:"x", age: 10, sex: "male" }

// 4 映射类型, type 能使用in关键字生成映射类型，但interface不行
type Keys = "name" | "sex"

type DulKey = {
  [key in Keys]: string // 类似for...in
}

let stu: DulKey = {
  name: "x",
  sex: "boy"
}